﻿#define _CRT_SECURE_NO_WARNINGS
#include"BinarySearchTree.h"

/*  这是不带相等数的版本  相等的数不留下  */

//int main()
//{
//	BSTree<int> t;
//	//如果不控制平衡就会麻烦
//	int a[] = { 8,3,1,10,6,4,7,14,13 };
//	for (auto e : a)
//	{
//		t.Insert(e);
//	}
//
//	t.InOrder();
//
//	t.Insert(11);
//	t.InOrder();
//
//	t.Insert(16);
//	t.InOrder();
//}



/*  这是可以相等的版本  相等的值可以留下  */
//这是key的部分
//int main()
//{
//	key::BSTree<int> t;
//	//如果不控制平衡就会麻烦
//	int a[] = { 8,3,1,10,6,4,7,14,13,2,4,6,8,16,10 };
//	for (auto e : a)
//	{
//		t.Insert(e);
//	}
//
//	t.InOrder();
//
//	t.Insert(11);
//	t.InOrder();
//
//	t.Erase(3);
//	t.InOrder();   
//
//	for (auto e : a)
//	{
//		t.Erase(e);
//		t.InOrder();
//	}
//
//	//cout << t.Find(1) << endl;
//
//}


//测试key_value的场景
//int main()
//{
//	key_value::BSTree<string, string> dict;   //模仿造一个字典
//	// BSTree<string,string> copy =dict;
//	dict.Insert("left", "左边");
//	dict.Insert("right", "右边");
//	dict.Insert("insert", "插入");
//	dict.Insert("string", "字符串");
//
//	string str;
//	while (cin >> str)   //这是表示输入字符串的   流提取
//	{
//		auto ret = dict.Find(str);
//		if (ret)
//		{
//			cout << "该单词的意思是:" << ret->_value << endl;
//		}
//		else
//		{
//			cout << "无此单词，请重新输入" << endl;
//		}
//	}
//	return 0;
//}


//set容器  对应key的场景
//map容器  对应key/value的场景   通过key去找value

//统计出现的次数
int main()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	key_value::BSTree<string, int> countTree;    //定义key是string    value是int
	//遍历这些水果
	for (const auto& str : arr)
	{
		// 先查找水果在不在搜索树中 
		// 1、不在，说明水果第一次出现，则插入<水果, 1> 
		// 2、在，则查找到的结点中水果对应的次数++ 
		//BSTreeNode<string, int>* ret = countTree.Find(str);
		auto ret = countTree.Find(str);    //实际上这里的ret是Node*类型   用auto来代替
		if (ret == nullptr)
		{
			countTree.Insert(str, 1);
		}
		else
		{
			ret->_value++;   //统计次数   ++value
		}
	}
		countTree.InOrder();

		key_value::BSTree<string, int> copy = countTree;    //拷贝问题（都应该是深拷贝  因为是节点的指针  一旦写了析构就会崩）
		copy.InOrder();   //但是这里实际是浅拷贝    前面补上了析构   一旦没有深拷贝   这里就会崩

		return 0;
}
